/**
 * @file linspaced_custom_tiling.h
 *
 * Copyright (C) 2025. Huawei Technologies Co. Ltd. All rights reserved.
 *
 * This program is distributed in the hope that it will be useful
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
#ifndef LINSPACED_CUSTOM_TILING_H
#define LINSPACED_CUSTOM_TILING_H

#include <cstdint>

constexpr uint32_t SIG_HALF = 0;    // float16
constexpr uint32_t SIG_FLOAT = 1;   // float32
constexpr uint32_t SIG_INT16 = 2;   // int16_t
constexpr uint32_t SIG_INT32 = 3;   // int32_t

struct LinspacedCustomTilingData {
    uint32_t totalLength;       //输出linspace序列的原始有效元素总数（对应核函数origSize）
    uint32_t dataType;          // 输入数据类型（SIG_HALF/SIG_FLOAT等，输出固定为SIG_FLOAT）
    uint32_t totalLengthAligned;// 对齐后的总元素数
    
    // 核间均分场景参数
    uint32_t blockLength;       // 每个核心处理的元素数
    uint32_t tileNum;           // 单个核心的Tile数量
    uint32_t tileLength;        // 常规Tile长度（元素数）
    uint32_t lastTileLength;    // 最后一个Tile长度
    
    // 核间非均分场景参数
    uint32_t formerNum;         // 多处理数据的核心数量
    uint32_t formerLength;      // 前N个核心的处理元素数
    uint32_t formerTileNum;     // 前N个核心的Tile数量
    uint32_t formerTileLength;  // 前N个核心的Tile长度
    uint32_t formerLastTileLength;

    uint32_t tailNum;           // 正常处理的核心数量
    uint32_t tailLength;        // 后M个核心的处理元素数
    uint32_t tailTileNum;       // 后M个核心的Tile数量
    uint32_t tailTileLength;    // 后M个核心的Tile长度
    uint32_t tailLastTileLength;

    uint32_t isEvenCore;        // 是否核间均分（1=是，0=否）
};

void TilingParamsCalc(uint32_t length, uint32_t alignNum,
                      uint32_t &tileNum, uint32_t &tileLength, uint32_t &lastTileLength);

void GenerateTilingData(uint8_t *tilingBuf, uint32_t blockDim);

#endif 
